package com.richard.base.ui

import android.app.Activity
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.content.res.Resources
import android.content.res.TypedArray
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.annotation.CallSuper
import com.alibaba.android.arouter.launcher.ARouter
import com.richard.base.common.loge
import com.richard.base.module.BusMsg
import com.richard.base.module.NavigateBean
import com.richard.base.route.KsRouterHelper
import me.yokeyword.fragmentation.SupportActivity
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode

/** 基础 Activity封装，使用时不要直接继承这个，
 * 请使用下面这两个。
 * @see BaseActivityWithCoroutineScope
 * @see BaseVMActivity
 */

abstract class BaseActivity : SupportActivity() {
    companion object {
        var accountCancellationObj = false
    }
    /**
     * 权限map
     * key： Manifest.permision.. 权限，value：对应的中文名称，比如存储权限
     */
    private var permissionMap: MutableMap<String, String>? = null
    private var deniedPermissionCount: Int = 0
    private var isOnPausing = false

    override fun onCreate(savedInstanceState: Bundle?) {
        setContentViewBefore()
        super.onCreate(savedInstanceState)

        if (isFirstReload()) {
            return
        }
        ARouter.getInstance().inject(this)

        EventBus.getDefault().register(this)

        //修复8.0 transparent 主题 崩溃问题
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
            val result = fixOrientation()
        }

        try {
            setStatusBarColor()
            setLightBarColor(true)
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }


        if (isSwipteBackEnable()) {//TODO 先预留着，现在 滑动返回貌似都没有完美的方案，后面有时间 调研 加上合适的。
//            SwipeBackHelper.onCreate(this)
//            SwipeBackHelper.getCurrentPage(this)
//                    .setSwipeBackEnable(true)
//                    .setSwipeSensitivity(0.5f)
//                    .setSwipeRelateEnable(true)
//                    .setSwipeRelateOffset(300)
//            //                    .setDisallowInterceptTouchEvent(true);//不抢占事件，默认关（事件将先由子View处理再由滑动关闭处理）
        }

        setLayoutView()
        initView()
        initData()

    }

    override fun getResources(): Resources {


        val res = super.getResources()
        val config = Configuration().apply { setToDefaults() }

        return res.apply { updateConfiguration(config, res.displayMetrics) }
    }

    /** 第一次启动，home键后，点击icon => app重启问题  */
    private fun isFirstReload(): Boolean {
        if (!isTaskRoot) {
            val intent = intent
            val intentAction = intent.action
            if (intent.hasCategory(Intent.CATEGORY_LAUNCHER)
                    && intentAction != null && intentAction == Intent.ACTION_MAIN) {
                finish()
                return true
            }
        }
        return false
    }

    open fun setContentViewBefore() {

    }


    abstract fun setLayoutView()


    abstract fun initView()
    abstract fun initData()

    override fun onResume() {
        isOnPausing = false
        super.onResume()
    }

    override fun onPause() {
        isOnPausing = true
        super.onPause()
    }

    override fun onDestroy() {
        super.onDestroy()
        if (EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this)
        }
    }

    private fun isTranslucentOrFloating(): Boolean {
        var isTranslucentOrFloating = false
        try {
            val styleableRes = Class.forName("com.android.internal.R\$styleable").getField("Window").get(null) as IntArray
            val ta = obtainStyledAttributes(styleableRes)
            val m = ActivityInfo::class.java.getMethod("isTranslucentOrFloating", TypedArray::class.java)
            m.isAccessible = true
            isTranslucentOrFloating = m.invoke(null, ta) as Boolean
            m.isAccessible = false
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return isTranslucentOrFloating
    }

    private fun fixOrientation(): Boolean {
        try {
            val field = Activity::class.java.getDeclaredField("mActivityInfo")
            field.isAccessible = true
            val o = field.get(this) as ActivityInfo
            o.screenOrientation = -1
            field.isAccessible = false
            return true
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return false
    }

    /**
     * 设置状态栏颜色
     *
     * @param color
     */
    fun setStatusBarColor(color: Int = statusBarColor()) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val window = this.window
            //状态栏改变颜色。
            window.statusBarColor = color
        }
    }

    open protected fun statusBarColor(): Int {
        return Color.WHITE
    }


    /**
     * 背景浅色时，改变状态栏字体颜色
     *
     * @param lightStatusBar
     */
    fun setLightBarColor(lightStatusBar: Boolean) {
        val decor = this.window.decorView
        var ui = decor.systemUiVisibility
        ui = if (lightStatusBar) {
            ui or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        } else {
            ui and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
        }
        decor.systemUiVisibility = ui
    }

    protected open fun isSwipteBackEnable(): Boolean {
        return false
    }

    /**
     * 空白页 包裹哪个view
     * 一般 返回 除了 title的 剩下的view
     * @return View
     */
    open fun wrapView(): View {
        return (findViewById<ViewGroup>(android.R.id.content)).getChildAt(0)
    }

    /**
     * 无数据时或者网络错误 时，重试
     */
    open fun onRetry() {

    }

    /**
     * 封装的 权限请求，上层调用 只需关心 权限同意后的 情况，拒绝，不再提示等 全部处理过
     * 自己Activity 通过  override onPermissionsGranted ,去处理同意后的逻辑
     *@param permissionMap ，key 对应Manifest.permission...,value对应的是 权限中文名称
     * @param isAutoTry 是否自动重试  请求权限校验放在 onResume() 中，当手机自带权限弹框消失后，会重新再走 onResume()的生命周期，所以会自动重试 需将 isAutoTry = false
     * example: mutableMapOf(Manifest.permission.WRITE_EXTERNAL_STORAGE to "存储权限",Manifest.permission.READ_PHONE_STATE to "电话权限")
     */
//    protected fun baseRequestPermission(permissionMap: MutableMap<String, String>, isAutoTry: Boolean = true) {
//
//        if (deniedPermissionCount >= 2) {
//            finish()
//            return
//        }
//        this.permissionMap = permissionMap
//
//
//        //先把同意了的权限过略掉，弹窗只显示没有同意的
//        val nonGranted = permissionMap.filter { !AndPermission.hasPermissions(this, it.key) }
//
//        if (nonGranted.isEmpty()) {
//            onPermissionsGranted()
//            return
//        }
//        nonGranted.keys.toTypedArray().run {
//
//            AndPermission.with(this@BaseActivity).runtime().permission(this)
//                    .rationale(RuntimeRationale())
//                    .onGranted {
//                        onPermissionsGranted()
//                    }.onDenied {
//                        deniedPermissionCount++
//                        //选择过 不再询问的
//                        if (AndPermission.hasAlwaysDeniedPermission(this@BaseActivity, it)) {
//
//                            val permissionNames = nonGranted.values.joinToString(prefix = "[", postfix = "]")
//                            RequestPermissionDialog(this@BaseActivity, permissionNames) {
//                                onPermissionCanceled(isAutoTry)
//                            }
//                        } else {
//                            if (isAutoTry) {
//                                if (isOnPausing) {
//                                    return@onDenied
//                                }
//                                if (isFinishing) {
//                                    return@onDenied
//                                }
//                                window.decorView.postDelayed({
//                                    if (isFinishing || isOnPausing) {
//                                        return@postDelayed
//                                    }
//                                    baseRequestPermission(permissionMap)
//                                }, 100)
//                            }
//                        }
//                    }.start()
//        }
//
//    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

    }

    protected open fun onPermissionsGranted() {

        "权限同意了，请override当前方法 来实现自己的功能".loge()
    }

    protected open fun onPermissionCanceled(isAutoTry: Boolean = true) {
        "申请权限取消，请override当前方法 来实现自己的功能,默认关闭当前页".loge()

    }


    @CallSuper
    @Subscribe(threadMode = ThreadMode.MAIN)
    open fun onEvent(event: BusMsg<NavigateBean>) {
        //路由事件
        if (event.code == BusMsg.PAGE_START) {
            KsRouterHelper.dispatcher(this, event.data!!)
        }
    }

//    private val onPermissionCancel: () -> Unit = {
//        onPermissionCanceled()
//    }

}